/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package AccesoDatos.Persistencia.Manager;

import AccesoDatos.Persistencia.Entidad.EMulta;
import LogicaNegocio.Biblioteca.Multa;
import MainBiblioSoft.BiblioSoft;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;

/**
 * Esta clase en java es el gestor de persistencia
 * de objetos Multa en la base de datos BiblioSoft.
 * 
 * @author sebaxtian
 * Archivo: ManagerMulta.java
 * @version 1.0
 * Fecha: lun may  3 01:39:34 COT 2010
 */


public class ManagerMulta {

    @PersistenceUnit
    private EntityManagerFactory managerFactory;
    private EntityManager entityManager;

    /**
     * Metodo constructor, crea un gestor para la persistencia de Multa
     * 
     */
    public ManagerMulta() {
        managerFactory = BiblioSoft.managerFactory;
        entityManager = managerFactory.createEntityManager();
    }

    /**
     * Metodo encargado de la persistencia en la entidad Multa
     * de un objeto Multa
     *
     * @param multa
     */
    public void crearMulta(Multa multa) {
        entityManager.clear();
        EMulta entidadMulta = new EMulta();
        entidadMulta.setIdentificacionusuario(multa.getIdentificacionUsuario());
        entidadMulta.setValor(multa.getValor());
        entidadMulta.setFechamulta(multa.getFecha());
        entidadMulta.setCancelada(multa.getCancelada());
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entityManager.persist(entidadMulta);
        transaccion.commit();
        entityManager.clear();
    }

    /**
     * Este metodo permite cambiar el estado de una multa
     * a cancelado.
     * 
     * @param idMulta
     */
    public void cancelarMulta(int idMulta) {
        entityManager.clear();
        EMulta entidadMulta;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadMulta = entityManager.find(EMulta.class, idMulta);
        transaccion.commit();
        if(entidadMulta != null){
            entidadMulta.setCancelada(true);
            transaccion.begin();
            entityManager.merge(entidadMulta);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Este metodo actualiza la multa de la base de datos.
     * 
     * @param idMulta
     * @param multa
     */
    public void actualizarMulta(int idMulta, Multa multa) {
        entityManager.clear();
        EMulta entidadMulta;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadMulta = entityManager.find(EMulta.class, idMulta);
        transaccion.commit();
        if(entidadMulta != null){
            entidadMulta.setIdentificacionusuario(multa.getIdentificacionUsuario());
            entidadMulta.setValor(multa.getValor());
            entidadMulta.setFechamulta(multa.getFecha());
            entidadMulta.setCancelada(multa.getCancelada());
            transaccion.begin();
            entityManager.merge(entidadMulta);
            transaccion.commit();
        }
        entityManager.clear();
    }

    /**
     * Obtiene una multa de la entida multa.
     *
     * @param idMulta
     * @return multa
     */
    public Multa obtenerMulta(int idMulta) {
        entityManager.clear();
        EMulta entidadMulta;
        Multa multa = null;
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        entidadMulta = entityManager.find(EMulta.class, idMulta);
        transaccion.commit();
        if(entidadMulta != null){
            multa.setIdMulta(entidadMulta.getIdmulta());
            multa.setIdentificacionUsuario(entidadMulta.getIdentificacionusuario());
            multa.setValor(entidadMulta.getValor());
            multa.setFecha(entidadMulta.getFechamulta());
            multa.setCancelada(entidadMulta.getCancelada());
        }
        entityManager.clear();
        return multa;
    }

    public boolean cancelarValorMulta(int identificacionUsuario) {
        entityManager.clear();
        int numeroFilas = 0;
        boolean cancelada = false;
        //UPDATE MULTA m SET m.CANCELADA = true WHERE m.IDENTIFICACIONUSUARIO = 1143825130;
        Query consulta = entityManager.createQuery("UPDATE EMulta e SET e.cancelada = TRUE WHERE e.identificacionusuario = :identificacionusuario");
        consulta.setParameter("identificacionusuario", identificacionUsuario);
        EntityTransaction transaccion = entityManager.getTransaction();
        transaccion.begin();
        numeroFilas = consulta.executeUpdate();
        transaccion.commit();
        if(numeroFilas > 0){
            cancelada = true;
        }
        entityManager.clear();
        return cancelada;
    }
}
